#ifndef GLOBAL_TEST_0725_H
#define GLOBAL_TEST_0725_H

#include <napi/native_api.h>

#ifdef __cplusplus
extern "C" {
#endif

napi_value kn_create_array(napi_env env);

uint32_t kn_get_array_length(napi_env env, napi_value value);

napi_value kn_get_element(napi_env env, napi_value value, int index);

void kn_set_element(napi_env env, napi_value array, int index, napi_value value);

bool kn_is_array(napi_env env, napi_value value);

bool kn_is_arraybuffer(napi_env env, napi_value value);

bool kn_is_typedarray(napi_env env, napi_value value);

size_t kn_get_arraybuffer_length(napi_env env, napi_value value);

uint8_t *kn_get_arraybuffer_value(napi_env env, napi_value value);

napi_typedarray_type kn_get_typedarray_type(napi_env env, napi_value value);

uint8_t *kn_get_typedarray_value(napi_env env, napi_value value);

size_t kn_get_typedarray_length(napi_env env, napi_value value);

napi_value kn_create_arraybuffer(napi_env env, uint8_t *ptr, size_t length);

size_t kn_get_typedarray_item_size(napi_typedarray_type typed);

napi_value kn_create_typedarray(napi_env env, uint8_t *data, size_t count, napi_typedarray_type typed);

int kn_get_cb_info_argc(napi_env env, napi_callback_info info);

void *kn_get_cb_info_data(napi_env env, napi_callback_info info);

napi_value *kn_get_cb_info_args(napi_env env, napi_callback_info info, int size);

napi_value kn_get_cb_info_jsThis(napi_env env, napi_callback_info info);

napi_value kn_new_instance(napi_env env, napi_value constructor);

//typedef void *(*callJSFunction)(void *data);

//struct CallbackData;

napi_value kn_call_function(napi_env env, napi_value recv, napi_value func, int size, const napi_value *argv,
                        napi_value *exceptionObj);

napi_value kn_create_function(napi_env env, const char *name, napi_callback callback, void *release);

napi_threadsafe_function kn_create_threadsafe_function_with_callback(napi_env env, const char *workName, void *callback);

void kn_call_threadsafe_function_with_data(napi_threadsafe_function tsfn, void *data);

static void kn_call_js(napi_env env, napi_value noUsed, void *context, void *data);

napi_threadsafe_function kn_create_threadsafe_function_sync(napi_env env, const char *workName);

void *kn_call_threadsafe_function(napi_threadsafe_function tsfn, void *callback, void *data, bool sync, int tsfnOriginTid);

napi_status kn_load_module_with_info(napi_env env, const char *path, const char *module_info, napi_value *result);

napi_status kn_load_module(napi_env env, const char *path, napi_value *result);

napi_value kn_create_object(napi_env env);

napi_value kn_get_global(napi_env env);

napi_value kn_get_undefined(napi_env env);

napi_value kn_get_null(napi_env env);

void kn_wrap(napi_env env, napi_value js_object, void *finalize_data, void *finalize_cb);

void *kn_unwrap(napi_env env, napi_value js_object);

bool kn_equals(napi_env env, napi_value a, napi_value b);

bool kn_instanceof(napi_env env, napi_value constructor, napi_value object);

napi_value kn_get_property_names(napi_env env, napi_value value);

napi_value kn_get_property(napi_env env, napi_value obj, napi_value key);

napi_value kn_get_named_property(napi_env env, napi_value obj, const char *key);

void kn_set_named_property(napi_env env, napi_value obj, const char *key, napi_value value);

napi_ref kn_create_reference(napi_env env, napi_value value);

void kn_delete_reference(napi_env env, napi_ref ref);

napi_value kn_get_reference_value(napi_env env, napi_ref ref);

char *kn_to_string(napi_env env, napi_value value);

napi_value kn_string_to_napi(napi_env env, const char *value);

int kn_to_int(napi_env env, napi_value value);

napi_value kn_int_to_napi(napi_env env, int value);

long kn_to_long(napi_env env, napi_value value);

napi_value kn_long_to_napi(napi_env env, long value);

bool kn_to_boolean(napi_env env, napi_value value);

napi_value kn_boolean_to_napi(napi_env env, bool value);

double kn_to_double(napi_env env, napi_value value);

napi_value kn_double_to_napi(napi_env env, double value);

napi_valuetype kn_typeof(napi_env env, napi_value value);


#ifdef __cplusplus
};
#endif

/** @} */
#endif // GLOBAL_TEST_0725_H
